package com.jingdianjichi.club.gateway;

import cn.dev33.satoken.stp.StpInterface;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.jingdianjichi.club.entity.AuthPermission;
import com.jingdianjichi.club.entity.AuthRole;
import com.jingdianjichi.club.redis.RedisUtil;
import io.netty.util.internal.StringUtil;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 自定义权限验证接口扩展 
 */
@Component
public class StpInterfaceImpl implements StpInterface {

    @Resource
    RedisUtil redisUtil;
    private String authPermissionPrefix = "auth.permission";
    private String authRolePrefix = "auth.role";

    /**
     * 根据登录ID和登录类型获取权限列表
     * 此方法首先会根据登录ID构建一个Redis键，然后尝试从Redis中获取对应的权限信息
     * 如果没有找到对应的权限信息，则返回一个空的权限列表
     * 如果找到了权限信息，则将其从JSON字符串解析为列表对象并返回
     *
     * @param loginId   登录ID，用于构建Redis键
     * @param loginType 登录类型，目前在方法实现中未使用，但可能在将来用于区分不同类型的登录用户
     * @return 权限列表，包含用户的权限字符串
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 构建Redis键，用于存储或获取权限信息
        String authKey = redisUtil.buildKey(authPermissionPrefix, loginId.toString());
        // 从Redis中获取权限信息
        String authValue = redisUtil.get(authKey);
        // 如果没有找到权限信息，则返回空列表
        if (authValue == null) {
            return Collections.emptyList();
        }
        List<AuthPermission> authPermissions = new Gson().fromJson(authValue, new TypeToken<List<AuthPermission>>() {
        }.getType());
        // 将获取到的JSON字符串解析为列表对象
        // 返回解析后的权限列表
        return authPermissions.stream().map(AuthPermission::getPermissionKey).collect(Collectors.toList());
    }

    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 构建Redis键，用于存储或获取权限信息
        String authKey = redisUtil.buildKey(authRolePrefix, loginId.toString());
        // 从Redis中获取权限信息
        String authValue = redisUtil.get(authKey);
        // 如果没有找到权限信息，则返回空列表
        if (authValue == null) {
            return Collections.emptyList();
        }
        List<AuthRole> authRoles = new Gson().fromJson(authValue, new TypeToken<List<AuthRole>>() {
        }.getType());
        // 将获取到的JSON字符串解析为列表对象
        // 返回解析后的权限列表
        return authRoles.stream().map(AuthRole::getRoleKey).collect(Collectors.toList());

    }
}
